package com.imut.lagain.service;
import org.slf4j.LoggerFactory;

import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;

/**
 * 文件存储服务接口
 */
public interface IFileStorageService {
    /**
     * 上传单个文件
     * @param file 文件
     * @param userId 用户ID
     * @param category 文件分类
     * @return 文件信息
     */
    Map<String, Object> uploadFile(MultipartFile file, Long userId, String category);
    
    /**
     * 批量上传文件
     * @param files 文件列表
     * @param userId 用户ID
     * @param category 文件分类
     * @return 上传结果列表
     */
    CompletableFuture<List<Map<String, Object>>> uploadFiles(List<MultipartFile> files, Long userId, String category);
    
    /**
     * 上传临时文件
     * @param file 文件
     * @param userId 用户ID
     * @return 临时文件信息
     */
    Map<String, Object> uploadTempFile(MultipartFile file, Long userId);
    
    /**
     * 确认临时文件（将临时文件转为正式文件）
     * @param tempId 临时文件ID
     * @param userId 用户ID
     * @param category 文件分类
     * @return 确认结果
     */
    Map<String, Object> confirmTempFile(String tempId, Long userId, String category);
    /**
     * 获取文件输入流
     * @param filePath 文件路径
     * @return 文件输入流
     * @throws IOException IO异常
     */
    InputStream getFileInputStream(String filePath) throws IOException;
    
    /**
     * 获取文件信息
     * @param filePath 文件路径
     * @return 文件信息
     */
    Map<String, Object> getFileInfo(String filePath);
    
    /**
     * 检查文件是否存在
     * @param filePath 文件路径
     * @return 是否存在
     */
    boolean fileExists(String filePath);
    /**
     * 删除文件
     * @param filePath 文件路径
     * @param userId 用户ID（用于权限验证）
     * @return 是否成功
     */
    boolean deleteFile(String filePath, Long userId);
    
    /**
     * 批量删除文件
     * @param filePaths 文件路径列表
     * @param userId 用户ID
     * @return 删除结果
     */
    CompletableFuture<Map<String, Object>> deleteFiles(List<String> filePaths, Long userId);
    
    /**
     * 移动文件
     * @param sourcePath 源路径
     * @param targetPath 目标路径
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean moveFile(String sourcePath, String targetPath, Long userId);
    
    /**
     * 复制文件
     * @param sourcePath 源路径
     * @param targetPath 目标路径
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean copyFile(String sourcePath, String targetPath, Long userId);
    /**
     * 清理临时文件
     * @return 清理的文件数量
     */
    CompletableFuture<Integer> cleanTempFiles();
    
    /**
     * 清理过期缓存的文件信息
     */
    void cleanExpiredFileCache();
    /**
     * 获取用户存储统计
     * @param userId 用户ID
     * @return 存储统计
     */
    Map<String, Object> getUserStorageStats(Long userId);
    
    /**
     * 获取系统存储统计
     * @return 系统存储统计
     */
    Map<String, Object> getSystemStorageStats();
}
